DML Supplier
Home

DML Supplier

DML Supplier

CRUD stored procedures voor de Supplier tabel. De afspraak is dat de namen voor de stored procedurs beginnen met de naam van de tabel gevolgd door de naam van de CRUD handeling. De naam wordt in pascalnotatie geschreven.

Probleem

We moeten de gegevens van een leverancier kunnen inserten, updaten, deleten en selecteren. De selectie moet kunnen gebeuren op basis van de naam, de code en de contactpersoon. De Supplier tabel heeft één foreign key kolom met de naam IdCountry. De waarde in deze kolom verwijst naar een waarde in de primary key kolom Id van de tabel Country. In de SelectOne stored procedure moet de naam van het land mee opgehaald worden. Immers de gebruiker geeft niets om id's, die gebruiken wij, programmeurs, intern om de tabellen aan elkaar te koppelen.

Design

Op basis van het Mikmak logisch model maken we de stored procedures. Naast de standaard stored procedures, Insert, Update, Delete, SelectOne, SelectAll, maken we voor elke tabelkolom waarbij de Searchable is ingesteld op SELECTBY maken we een stored procedure waarbij er gezocht kan worden op deze kolom in de tabel.

Naam Beschrijving
SupplierInsert bevat 1 OUTPUT parameter om de nieuw Id te retourneren naar het calling programma
SupplierUpdate deze stored procedure updatet alle kolommen van de rij met de opgegeven Id
SupplierSelectOne lees 1 rij in uit de tabel op basis van de Id, neem alle kolommen mee voor het detail venster
SupplierSelectAll lees alle rijen in uit de tabel maar alleen de kolommen die we in de lijst willen laten zien (zie List kolom in logisch model)
SupplierSelectByCode lees 1 rij in uit de tabel op basis van de Code maar alleen de kolommen die we in de lijst willen laten zien (zie List kolom in logisch model)
SupplierSelectByName lees 1 rij in uit de tabel op basis van de Name maar alleen de kolommen die we in de lijst willen laten zien (zie List kolom in logisch model)
SupplierSelectByContact lees 1 rij in uit de tabel op basis van de Contact maar alleen de kolommen die we in de lijst willen laten zien (zie List kolom in logisch model)

Oplossing

Insert

-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Wednesday 6th of January 2016 11:45:34 AM
-- DML Insert Stored Procedure for Supplier 
-- 
USE Mikmak;
-- Vooraleer de stored procedure te creëren, test als
-- de die al bestaat. Als de SP al bestaat
-- moet je die eerst droppen
IF EXISTS (SELECT 1 FROM sys.procedures WHERE object_id = OBJECT_ID(N'SupplierInsert'))
BEGIN
    DROP PROCEDURE SupplierInsert
END
GO
CREATE PROCEDURE "SupplierInsert"
(
    @Code NVARCHAR (10) ,
    @Name NVARCHAR (255) ,
    @Contact NVARCHAR (255) ,
    @Address NVARCHAR (255) ,
    @City NVARCHAR (255) ,
    @Region NVARCHAR (80) ,
    @PostalCode VARCHAR (20) ,
    @IdCountry INT ,
    @Phone VARCHAR (40) ,
    @Mobile VARCHAR (40) ,
    @Id INT  output
)
AS
BEGIN
INSERT INTO "Supplier"
    (
        "Supplier"."Code",
        "Supplier"."Name",
        "Supplier"."Contact",
        "Supplier"."Address",
        "Supplier"."City",
        "Supplier"."Region",
        "Supplier"."PostalCode",
        "Supplier"."IdCountry",
        "Supplier"."Phone",
        "Supplier"."Mobile"
    )
    VALUES
    (
        @Code,
        @Name,
        @Contact,
        @Address,
        @City,
        @Region,
        @PostalCode,
        @IdCountry,
        @Phone,
        @Mobile
    );
    set @Id = SCOPE_IDENTITY();
END 
GO

De Insert stored procedure testen

We beginnen met het inserten van een leverancier met een Country Id die niet bestaat. Hiermee wil ik tonen wat een foreign key constraint in SQL precies betekent. We hebben het land met Country Id = 1 daarnet gedeleted. Als we nu een leverancier willen toegvoegen met IdCountry = 1 krijgen we een foutmelding omdat we een leverancier willen inserten met een Country Id die niet in de tabel Country bestaat.

SupplierInsert foutmelding omwille van overtreding van de FK constraint
SupplierInsert foutmelding omwille van overtreding van de FK constraint

We proberen opnieuw maar nu met een bestand Country Id:

SupplierInsert is geslaagd
SupplierInsert is geslaagd

Update

De Update stored procedure gelijkt op de Insert. Maar hier geef je de Id mee van de rij die je wilt updaten. Hier geldt ook de foreign key constraint. De IdCountry die je meegeeft moet in de tabel Country bestaan. Anders krijg je een foutmelding.

-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Thursday 7th of January 2016 11:02:23 AM
-- DML Update Stored Procedure for Supplier
-- 
USE Mikmak;
-- Vooraleer de stored procedure te creëren, test als
-- de die al bestaat. Als de SP al bestaat
-- moet je die eerst droppen
IF EXISTS (SELECT 1 FROM sys.procedures WHERE object_id = OBJECT_ID(N'SupplierUpdate'))
BEGIN
    DROP PROCEDURE SupplierUpdate
END
GO
CREATE PROCEDURE "SupplierUpdate"
(
	@Code NVARCHAR (10) ,
	@Name NVARCHAR (255) ,
	@Contact NVARCHAR (255) ,
	@Address NVARCHAR (255) ,
	@City NVARCHAR (255) ,
	@Region NVARCHAR (80) ,
	@PostalCode VARCHAR (20) ,
	@IdCountry INT ,
	@Phone VARCHAR (40) ,
	@Mobile VARCHAR (40) ,
	@Id INT 
)
AS
BEGIN
UPDATE "Supplier"
	SET
		"Code" = @Code,
		"Name" = @Name,
		"Contact" = @Contact,
		"Address" = @Address,
		"City" = @City,
		"Region" = @Region,
		"PostalCode" = @PostalCode,
		"IdCountry" = @IdCountry,
		"Phone" = @Phone,
		"Mobile" = @Mobile
	WHERE "Supplier"."Id" = @Id;
END 
GO

We testen de Update stored procedure en veranderen de IdCountry waarde;

SupplierUpdate Stored Procedure Test
SupplierUpdate Stored Procedure Test

Delete

We maken eerste de stored procedure:

-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Thursday 7th of January 2016 11:02:23 AM
-- DML Delete Stored Procedure for Supplier 
-- 
USE Mikmak;
-- Vooraleer de stored procedure te creëren, test als
-- de die al bestaat. Als de SP al bestaat
-- moet je die eerst droppen
IF EXISTS (SELECT 1 FROM sys.procedures WHERE object_id = OBJECT_ID(N'SupplierDelete'))
BEGIN
    DROP PROCEDURE SupplierDelete
END
GO
CREATE PROCEDURE "SupplierDelete"
(
	 @Id INT 
)
AS
BEGIN
DELETE FROM "Supplier"
	WHERE "Supplier"."Id" = @Id;
END 
GO

We testen de Delete stored procedure en we deleten de leverancier met Id = 1:

SupplierDelete Stored Procedure Test
SupplierDelete Stored Procedure Test

We voegen onze leverancier opnieuw toe:

exec SupplierInsert 'LEV00001AA', 'De Schoenmaker', 'Jan Jannsens', 'De Eerstestraat 1', 
     'Antwerpen', 'Antwerpen', '2000',      '2', '032458987', '0486665478', @Id output
print @Id
select * from Supplier
SupplierInsert opnieuw uitvoeren
SupplierInsert opnieuw uitvoeren

SelectOne

De SelectOne stored procedure is speciaal. We moeten immers niet alleen de IdCountry waarde ophalen maar ook de naam van het land. Daarvoor hebben we een inner join nodig om de tabel Supplier te linken aan de tabel Country. Let erop dat we alle kolommen laten voorafgaan door de naam van de tabel om abiguïteit te vermijden. De kolomnaam Name en Code bijvoorbeeld komen zowel voor in de tabel Country als in de tabel Supplier.

-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Thursday 7th of January 2016 11:02:23 AM
-- DML SelectOne Stored Procedure for Supplier 
-- 
USE Mikmak;
-- Vooraleer de stored procedure te creëren, test als
-- de die al bestaat. Als de SP al bestaat
-- moet je die eerst droppen
IF EXISTS (SELECT 1 FROM sys.procedures WHERE object_id = OBJECT_ID(N'SupplierSelectOne'))
BEGIN
    DROP PROCEDURE SupplierSelectOne
END
GO
CREATE PROCEDURE "SupplierSelectOne"
(
     @Id INT 
)
AS
BEGIN
SELECT "Supplier"."Code",
        "Supplier"."Name",
        "Supplier"."Contact",
        "Supplier"."Address",
        "Supplier"."City",
        "Supplier"."Region",
        "Supplier"."PostalCode",
        "Supplier"."IdCountry",
        "Country"."Name" as CountryName,
        "Supplier"."Phone",
        "Supplier"."Mobile"
    FROM "Supplier"
    INNER JOIN "Country" ON "Supplier"."IdCountry" = "Country"."Id"
    WHERE "Supplier"."Id" = @Id;
END 
GO

We testen de stored procedure:

SupplierSelectOne Stored Procedure Test
SupplierSelectOne Stored Procedure Test

SelectAll

We moeten in Mikmak logisch model om te gaan kijken welke kolommen getoond moeten worden. In de List kolom staat YES als de kolom in de SelectAll stored procedure moet worden opgenomen.

-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Thursday 7th of January 2016 11:44:53 AM
-- DML SelectAll Stored Procedure for table Supplier 
-- 
USE Mikmak;
-- Vooraleer de stored procedure te creëren, test als
-- de die al bestaat. Als de SP al bestaat
-- moet je die eerst droppen
IF EXISTS (SELECT 1 FROM sys.procedures WHERE object_id = OBJECT_ID(N'SupplierSelectAll'))
BEGIN
    DROP PROCEDURE SupplierSelectAll
END
GO
CREATE PROCEDURE "SupplierSelectAll"
AS
BEGIN
SELECT "Supplier"."Code",
    "Supplier"."Name",
    "Country"."Name" as "CountryName",
    "Supplier"."IdCountry",
    "Supplier"."Id"
    FROM "Supplier"
    INNER JOIN "Country"
        ON "Supplier"."IdCountry" = "Country"."Id"
    ORDER BY "Name";
END 
GO

We testen de SelectAll stored procedure uit:

SupplierSelectAll Stored Procedure Test
SupplierSelectAll Stored Procedure Test

SelectByCode

We maken eerste de stored procedure:

-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Thursday 7th of January 2016 11:44:53 AM
-- DML SelectByCode Stored Procedure for table Supplier
-- 
USE Mikmak;
-- Vooraleer de stored procedure te creëren, test als
-- de die al bestaat. Als de SP al bestaat
-- moet je die eerst droppen
IF EXISTS (SELECT 1 FROM sys.procedures WHERE object_id = OBJECT_ID(N'SupplierSelectByCode'))
BEGIN
    DROP PROCEDURE SupplierSelectByCode
END
GO
CREATE PROCEDURE "SupplierSelectByCode"
(
     @Code NVARCHAR (10) 
)
AS
BEGIN
SELECT "Supplier"."Code",
    "Supplier"."Name",
    "Country"."Name" as "CountryName",
    "Supplier"."IdCountry",
    "Supplier"."Id"

    FROM "Supplier"
    INNER JOIN "Country" as "Country"
        ON "Supplier"."IdCountry" = "Country"."Id"
    WHERE "Supplier"."Code" = @Code
    ORDER BY "Supplier"."Code";
END 
GO

En testen die vervolgens

exec SupplierSelectByCode 'LEV00001AA'

SelectByName

We maken eerst de stored procedure:

-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Thursday 7th of January 2016 11:44:53 AM
-- DML SelectByName Stored Procedure for table Supplier
-- 
USE Mikmak;
-- Vooraleer de stored procedure te creëren, test als
-- de die al bestaat. Als de SP al bestaat
-- moet je die eerst droppen
IF EXISTS (SELECT 1 FROM sys.procedures WHERE object_id = OBJECT_ID(N'SupplierSelectByName'))
BEGIN
    DROP PROCEDURE SupplierSelectByName
END
GO
CREATE PROCEDURE "SupplierSelectByName"
(
	 @Name NVARCHAR (255) 
)
AS
BEGIN
SELECT "Supplier"."Code",
	"Supplier"."Name",
	"IdCountry-Country"."Name" as "IdCountryName",
	"Supplier"."IdCountry",
	"Supplier"."Id"

	FROM "Supplier"
	INNER JOIN "Country" as "IdCountry-Country"
		ON "Supplier"."IdCountry" = "IdCountry-Country"."Id"
	WHERE "Supplier"."Name" = @Name
	ORDER BY "Supplier"."Name";
END 
GO

En testen die uit:

exec SupplierSelectByName 'De Schoenmaker'

SelectByContact

We maken de stored procedure:

-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Thursday 7th of January 2016 11:44:53 AM
-- DML SelectByContact Stored Procedure for table Supplier
-- 
USE Mikmak;
-- Vooraleer de stored procedure te creëren, test als
-- de die al bestaat. Als de SP al bestaat
-- moet je die eerst droppen
IF EXISTS (SELECT 1 FROM sys.procedures WHERE object_id = OBJECT_ID(N'SupplierSelectByContact'))
BEGIN
    DROP PROCEDURE SupplierSelectByContact
END
GO
CREATE PROCEDURE "SupplierSelectByContact"
(
     @Contact NVARCHAR (255) 
)
AS
BEGIN
SELECT "Supplier"."Code",
    "Supplier"."Name",
    "Country"."Name" as "CountryName",
    "Supplier"."IdCountry",
    "Supplier"."Id"

    FROM "Supplier"
    INNER JOIN "Country"
        ON "Supplier"."IdCountry" = "Country"."Id"
    WHERE "Supplier"."Contact" = @Contact
    ORDER BY "Supplier"."Contact";
END 
GO

En testen de stored procedure uit:

exec SupplierSelectByContact 'Jan Jannsens'

SelectByIdCountry

We beginnen met de stored procedure te maken:

-- modernways.be
-- created by an orm apart
-- Entreprise de modes et de manières modernes
-- MySql DML
-- Created : Thursday 7th of January 2016 11:44:53 AM
-- DML SelectByIdCountry Stored Procedure for table Supplier
--
USE Mikmak;
-- Vooraleer de stored procedure te creëren, test als
-- de die al bestaat. Als de SP al bestaat
-- moet je die eerst droppen
IF EXISTS (SELECT 1 FROM sys.procedures WHERE object_id = OBJECT_ID(N'SupplierSelectByIdCountry'))
BEGIN
DROP PROCEDURE SupplierSelectByIdCountry
END
GO
CREATE PROCEDURE "SupplierSelectByIdCountry"
(
@IdCountry INT
)
AS
BEGIN
SELECT "Supplier"."Code",
"Supplier"."Name",
"Country"."Name" as "CountryName",
"Supplier"."IdCountry",
"Supplier"."Id"

FROM "Supplier"
INNER JOIN "Country"
ON "Supplier"."IdCountry" = "Country"."Id"
WHERE "Supplier"."IdCountry" = @IdCountry;
END
GO

En testen de stored procedure uit:

exec SupplierSelectByIdCountry 3

JI
2017-01-17 21:49:01